/** 
 * 组件中调用 import { newFormatDate } from "@/utils/commMethods";
 * 函数接口单独暴露 export function newFormatDate(){}
 * 
 * 全局注册调用在main.js中引用
 * import medhods from './utils/commMethods.js';
 * Vue.prototype.$check = check;
 * // 组件中调用 if($check.isEmail(e)){}
 * 默认暴露 export default {newFormatDate(){}}
 */

/**
 * 时间戳转正常格式
 * @param {string} email
 * @returns 0000-00-00 00:00:00
 * @returns 0000年00月00日 00:00:00
 */
export function newFormatDate(timestamp) {
  var date = new Date(timestamp * 1000); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
  var year = date.getFullYear()
  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
  // return year + '年' + month + '月' + day + '日' + ' ' +  hours + ':' + minutes + ':' + seconds
}

/**
 * @function 中国标准时间转化为时间戳(Fri Jan 10 2020 18:52:45 GMT+0800 (中国标准时间))
 * @param {string} date
 * @returns {number} 时间戳
 * */
export function dateToMs(date) {
  let result = new Date(date).getTime();
  return result;
}

/**
 * 有效的电子邮件
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/**
 * 有效的url地址
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}


/**
 * 判断类型集合
 * @param str {string}
 * @type:
 * 'phone': //手机号码
 * 'tel': //座机
 * 'card': //身份证
 * 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
 * 'postal': //邮政编码
 * 'QQ': //QQ号
 * 'email': //邮箱
 * 'money': //金额(小数点2位)
 * 'URL': //网址
 * 'IP': //IP
 * 'date': //日期时间
 * 'number': //数字
 * 'english': //英文
 * 'chinese': //中文
 * 'lower': //小写
 * 'upper': //大写
 * 'HTML': //HTML标记
 * @returns {Boolean}
 */
export function checkStr(str, type) {
  switch (type) {
    case 'phone': //手机号码
      return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
    case 'tel': //座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
    case 'card': //身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
    case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str)
    case 'postal': //邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str);
    case 'QQ': //QQ号
      return /^[1-9][0-9]{4,9}$/.test(str);
    case 'email': //邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
    case 'money': //金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str);
    case 'URL': //网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
    case 'IP': //IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
    case 'date': //日期时间
      return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
    case 'number': //数字
      return /^[0-9]$/.test(str);
    case 'english': //英文
      return /^[a-zA-Z]+$/.test(str);
    case 'chinese': //中文
      return /^[\\u4E00-\\u9FA5]+$/.test(str);
    case 'lower': //小写
      return /^[a-z]+$/.test(str);
    case 'upper': //大写
      return /^[A-Z]+$/.test(str);
    case 'HTML': //HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
    default:
      return true;
  }
}

/**
 * 深拷贝
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 * @param {Object} source
 * @returns {Object}
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
  // 使用JSON实现深拷贝
  // return JSON.parse(JSON.stringify(source))
}


/**去除空格
 * str: {string}
 * type: 1-所有空格 2-前后空格 3-前空格 4-后空格
 */
export function removeSpaces(str, type) {
  type = type || 1
  switch (type) {
    case 1:
      return str.replace(/\s+/g, "");
    case 2:
      return str.replace(/(^\s*)|(\s*$)/g, "");
    case 3:
      return str.replace(/(^\s*)/g, "");
    case 4:
      return str.replace(/(\s*$)/g, "");
    default:
      return str;
  }
}

// 最大值
export function arrMax(arr) {
  return Math.max.apply(null, arr);
}

// 最小值
export function arrMin(arr) {
  return Math.min.apply(null, arr);
}


// 防抖：防止重复点击触发事件(又分为重复点击停止后触发和重复点击的第一次点击触发，一般用前者)
export function debounce(fn, time) {
  let _arguments = arguments
  let timeout = null
  return () => {
    if (timeout) {
      clearTimeout(timeout)
    }
    timeout = setTimeout(() => {
      fn.call(this, _arguments)
    }, time);
  }
}
// vue防抖函数改造 fnName: String
export function VueDebounce(fnName, time) {
  let timeout = null;
  return function () {
    if (timeout) {
      clearTimeout(timeout);
    }
    timeout = setTimeout(() => {
      this[fnName]();
    }, time);
  };
}
// 节流：指定时间间隔内只会执行一次任务
export function throttle(fn, time) {
  let _arguments = arguments
  let canRun = true
  return () => {
    if (!canRun) return
    canRun = false
    setTimeout(() => {
      fn.call(this, _arguments)
      canRun = true
    }, time);
  }
}
// vue节流函数改造 fnName: String
export function VueThrottle(fnName, time) {
  let canRun = true
  return () => {
    if (!canRun) return
    canRun = false
    setTimeout(() => {
      this[fnName]();
      canRun = true
    }, time);
  }
}

/**
 * 洗牌算法随机,生成随机数组
 */
export function shuffle (arr) {
  var result = [],
      random;
  while (arr.length > 0) {
      random = Math.floor(Math.random() * arr.length);
      result.push(arr[random])
      arr.splice(random, 1)
  }
  return result;
}
